package com.changgou.order.service.impl;

import com.changgou.entity.Constants;
import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.feign.SpuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.goods.pojo.Spu;
import com.changgou.order.pojo.OrderItem;
import com.changgou.order.service.CartService;
import com.changgou.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 *
 */
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private SkuFeign skuFeign;

    @Autowired
    private SpuFeign spuFeign;

    /**
     * 添加商品到购物车
     * @param skuId     添加购物车商品的库存id
     * @param num       购买数量(这里的购买数量支持购物车中数量加减)
     * @param userName  当前登录用户的用户名(购买人)
     *
     * 购物车在redis中保存的数据格式例如:
     *                 key字符串类型 : value(Map格式)
     *                 cart_用户名 : skuId,  OrderItem
     *                 cart_zhangsan: 1,  OrderItem
     *                 cart_zhangsan: 5,  OrderItem
     */
    @Override
    public void add(String skuId, Integer num, String userName) {
        //1. 根据用户名和skuId到redis中获取购物项
        OrderItem orderItem= (OrderItem) redisTemplate.boundHashOps(Constants.REDIS_CART + userName).get(skuId);

        //2. 判断这个购物项能否获取到, 能获取到, 说明用户之前买过一件, 这个时候,则需要进行购买数量的加减就可以
        if (orderItem != null) {
            //购买数量=原来购买量+现在购买量
            orderItem.setNum(orderItem.getNum() + num);
            //因为支持购买数量加减, 所以得判断最终购买数量最少是1件
            if (orderItem.getNum() <= 0) {
                //如果购买数量最终为小于一件, 则将这个购物项从购物车中删除
                redisTemplate.boundHashOps(Constants.REDIS_CART + userName).delete(skuId);
                return;
            }
            //总金额
            orderItem.setMoney(orderItem.getPrice() * orderItem.getNum());
            //实付金额
            orderItem.setPayMoney(orderItem.getPrice() * orderItem.getNum());

        } else {
            //3. 如果这个购物项为空, 说明用户之前没有购买过, 则需要从新创建购物项对象, 加入进去
            orderItem = createOrderItem(skuId, num, userName);
        }

        //将OrderItem对象放入购物车
        redisTemplate.boundHashOps(Constants.REDIS_CART + userName).put(skuId, orderItem);
    }

    @Override
    public Map<String, Object> list(String userName) {
        //1. 根据用户名获取这个人的购物车集合返回
        Map<String, OrderItem> cart = redisTemplate.boundHashOps(Constants.REDIS_CART + userName).entries();

        //2. 判断如果购物车不为空, 则计算总购买商品数量, 总购物买金额
        //总购买商品数量
        long totalNum = 0;
        //总购买金额
        long totalPrice = 0;
        if (cart != null) {
            Set<Map.Entry<String, OrderItem>> entries = cart.entrySet();
            for (Map.Entry<String, OrderItem> entry : entries) {
                //累加总购买商品数量
                totalNum += entry.getValue().getNum();
                //累加总购买金额
                totalPrice += entry.getValue().getMoney();
            }
        }

        Map<String, Object>  resultMap = new HashMap();
        //购物车集合数据
        resultMap.put("orderItemList", cart.values());
        //总购买数量
        resultMap.put("totalNum", totalNum);
        //总购买金额
        resultMap.put("totalPrice", totalPrice);
        return resultMap;
    }

    @Override
    public void delete(String username, String skuId) {
        redisTemplate.boundHashOps(Constants.REDIS_CART + username).delete(skuId);
    }

    @Override
    public void updateChecked(String username, String skuId, Boolean checked) {
        //1. 根据用户名和skuId, 到redis中获取购物项
        OrderItem orderItem = (OrderItem) redisTemplate.boundHashOps(Constants.REDIS_CART + username).get(skuId);

        //2. 修改购物项中, 复选框状态值
        if (orderItem != null) {
            orderItem.setChecked(checked);

            //3. 将购物项放回到redis中覆盖redis中之前的值
            redisTemplate.boundHashOps(Constants.REDIS_CART + username).put(skuId, orderItem);
        }

    }

    /**
     * 创建购物项对象
     * @param skuId 购买商品的库存Id
     * @param num   购买数量
     * @param userName  购买人的用户名
     * @return
     */
    private OrderItem createOrderItem(String skuId, Integer num, String userName) {

        OrderItem orderItem = new OrderItem();

        //根据库存id获取库存对象
        Sku sku = skuFeign.findOneById(skuId);
        if (sku == null) {
            throw new RuntimeException("您的skuId不可以胡乱写, skuId错了, 数据库中不存在!");
        }
        //根据商品id获取商品对象
        Spu spu = spuFeign.findOne(sku.getSpuId());

        //购物项主键id
        orderItem.setId(String.valueOf(idWorker.nextId()));
        //商品一级分类
        orderItem.setCategoryId1(spu.getCategory1Id());
        //商品二级分类
        orderItem.setCategoryId2(spu.getCategory2Id());
        //商品三级分类
        orderItem.setCategoryId3(spu.getCategory3Id());
        //邮费
        orderItem.setPostFee(0);
        //库存标题
        orderItem.setName(sku.getName());
        //商品重量
        orderItem.setWeight(sku.getWeight());
        //示例图片
        orderItem.setImage(sku.getImage());
        //单价
        orderItem.setPrice(sku.getPrice());
        //库存id
        orderItem.setSpuId(sku.getSpuId());
        //商品id
        orderItem.setSkuId(skuId);
        //是否选中, 页面购物车列表复选框是否选中
        orderItem.setChecked(true);
        //购买数量
        orderItem.setNum(num);
        //总金额
        orderItem.setMoney(orderItem.getPrice() * orderItem.getNum());
        //支付金额
        orderItem.setPayMoney(orderItem.getPrice() * orderItem.getNum());
        return orderItem;
    }
}
